El viento derivado de satélites se codifica como tipo 240 - 260 dependiendo del instrumento. Sin embargo ni GFS ni el resto de los sistemas operativos usan las observaciones presentes en el prepbufr y en cambio leen el bufr específico gdas.tHHz.satwnd.tm00.bufr_D.
En la Tabla 18 se detalla el uso de las distintas observaciones según el instrumento.
Mejor y con más detalle Tabla b
read_obs.f90
read_satwnd.f90
For the satellite ID type:
For satellite subtype:
The quality mark:the values range from 0 to 15.
Notas:
Prueba de asimilación usando 3DVar para hacer un par de experimentos rápidos.
Fecha: 2018112100
exp[bottom_top %in% seq(1, 60, 10)] %>%
ggplot(aes(west_east, south_north)) +
geom_point(aes(color = u)) +
scale_color_divergent() +
facet_grid(exp~bottom_top)
diff[bottom_top %in% seq(20, 58, 2)] %>%
ggplot(aes(west_east, south_north)) +
geom_point(aes(color = u.diff)) +
scale_color_divergent() +
facet_wrap(~bottom_top)
diag <- fread("/home/paola.corrales/comGSIv3.7_EnKFv1.3/examples/test/gsi_satwnd/results_conv_ges.2018112100") %>%
.[, c("V2", "V4") := NULL]
colnames(diag) <- c("var", "stationID", "type", "dhr", "lat", "lon", "pressure", "usage.flag", "obs", "obs.guess", "obs2", "obs.guess2", "rerr")
diag <- diag[type %between% c(240, 260)] %>%
.[, sat_type := case_when(
type == 240 ~ "GOES SW winds",
type == 241 ~ "India",
type == 242 ~ "JMA Visible",
type == 243 ~ "EUMETSAT visible",
type == 244 ~ "AVHRR winds",
type == 245 ~ "GOES IR",
type == 246 ~ "GOES WV cloud top",
type == 247 ~ "GOES WV deep layer",
type == 248 ~ "GOES cloud top (sounder)",
type == 249 ~ "GOES deep layer (sounder)",
type == 250 ~ "JMA WV deep layer",
type == 251 ~ "GOES visible",
type == 252 ~ "JMA IR winds",
type == 253 ~ "EUMETSAT IR winds",
type == 254 ~ "EUMETSAT WV deep layer winds",
type == 257 ~ "MODIS IR",
type == 258 ~ "MODIS WV cloud top",
type == 259 ~ "MODIS WV deep layer winds",
type == 260 ~ "VIIR IR winds")] %>%
melt(measure.vars = c("obs", "obs2", "obs.guess", "obs.guess2")) %>%
.[, var := if_else(str_detect(variable, "2"), "v", "u")] %>%
.[, variable := str_remove(variable, "2")] %>%
pivot_wider(names_from = variable, values_from = value) %>%
setDT
diag[var == "u"] %>%
ggplot(aes(ConvertLongitude(lon), lat)) +
geom_point(aes(color = sat_type)) +
geom_mapa() +
coord_sf(xlim = c(-75, -52), ylim = c(-42,-20)) +
facet_wrap(~usage.flag, labeller = labeller(usage.flag = c("-1" = "rejected",
"1" = "asimilated"))) +
labs(color = "Source",
x = "lon") +
theme_minimal()
Comparando la distribución espacial de las observaciones rechazadas y asimiladas, no se ve gran diferencia. Lo único más notable es que todas las observaciones de EUMESAT son rechazadas, no queda claro si esto se debe a una casualidad (justo en este tipo estas observaciones eran de baja calidad o estaban muy lejos del guess) o si es algo definido en el código de GSI.
Revisando el código (read_satwnd.f90) parece que los “WV deep layer” se usan para monitoreo. También dice: “reject data zenith angle >68.0 degree”, habría que ver el ángulo zenital de estas observaciones. A simple vista hay muchas observaciones con un ángulo zenital menor a 68 grados así que esta no sería la causa para recharzar todas las observaciones.
Es notorio que el error de las observaciones rechazadas en la mayoría de los casos es Inf.
N_obs <- diag[var == "u", .N, by = .(usage.flag, var)] %>%
.[, label := paste("N = ", N)] %>%
.[, ":="(lon = 302.0,
pressure = 920)]
diag[var == "u"] %>%
ggplot(aes(ConvertLongitude(lon), pressure)) +
geom_point(aes(color = sat_type)) +
scale_y_level(name = "pressure level", breaks = c(1000, 900, 700, 500, 400, 300, 200, 100)) +
scale_x_longitude(breaks = seq(-75, -55, 5)) +
geom_label(data = N_obs, aes(x = ConvertLongitude(lon), y = pressure, label = label)) +
facet_grid(var~usage.flag, labeller = labeller(usage.flag = c("-1" = "rejected",
"1" = "asimilated"))) +
labs(color = "Source",
x = "lon",
y = "pressure level") +
theme_minimal()
diag %>%
ggplot((aes(ConvertLongitude(lon), lat))) +
geom_point(aes(color = obs)) +
scale_color_divergent() +
geom_mapa() +
coord_sf(xlim = c(-75, -52), ylim = c(-42,-20)) +
facet_grid(var~usage.flag, labeller = labeller(usage.flag = c("-1" = "rejected",
"1" = "asimilated"))) +
theme_minimal()
diag[var == "u"] %>%
ggplot(aes(ConvertLongitude(lon), pressure)) +
geom_point(aes(color = obs.guess)) +
scale_color_divergent() +
scale_y_level(name = "pressure level", breaks = c(1000, 900, 700, 500, 400, 300, 200, 100)) +
scale_x_longitude(breaks = seq(-75, -55, 5)) +
geom_label(data = N_obs, aes(x = ConvertLongitude(lon), y = pressure, label = label)) +
facet_grid(var~usage.flag, labeller = labeller(usage.flag = c("-1" = "rejected",
"1" = "asimilated"))) +
labs(color = "Source",
x = "lon",
y = "pressure level") +
theme_minimal()
10 miembros y 24 ciclos de asimilación arrancando a las 18 UTC del 20181120
files <- Sys.glob("analisis/diagfiles/E2/asim_conv*")
obs <- purrr::map(files, function(f) {
diag <- fread(f) %>%
.[, exp := basename(dirname(f))] %>%
.[, date := ymd_hms(stringr::str_extract(f, "\\d{14}"))] %>%
.[]
}) %>%
rbindlist() %>%
.[, c("V2", "V4") := NULL]
colnames(obs) <- c("var", "stationID", "type", "dhr", "lat", "lon", "pressure", "usage.flag", "flag.prep", "obs", "obs.guess", "obs2", "obs.guess2", "rerr", "exp", "date")
obs[, .N, by = .(exp, var, usage.flag)] %>%
dcast(exp + usage.flag ~ var, value.var = "N") %>%
knitr::kable()
| exp | usage.flag | ps | q | t | uv |
|---|---|---|---|---|---|
| E2 | -1 | 77186 | 398 | 18681 | 98115 |
| E2 | 1 | 15647 | 21849 | 85436 | 66180 |
obs[, .N, by = .(var, date, exp, usage.flag)] %>%
ggplot(aes(date, N)) +
geom_line(aes(color = var, linetype = factor(usage.flag))) +
scale_linetype_manual(values = c("-1" = 2, "1" = 1)) +
labs(title = "Cantidad de observaciones asimiladas y rechazadas según variable",
linetype = "Uso",
color = "experimento") +
theme_minimal()
Por defecto las observaciones tipo 251 = GOES Visible no se asimilan porque no tienen error definido. Algunas otras observaciones tienen defidino un error para algunos niveles y otros no. Esto permite controlar a que niveles se asimilacada observación, lo complicado sería redefinir estos errores para asimilar más o menos oservaciones sin conocer mejor el tipo de observación.
Respecto a la tabla convinfo, algunos tipos de observación tienen subtipos (algunos se asimilan, otros no) y no logro encontrar que significan canda uno.
obs[var == "uv", .N, by = .(var, type, usage.flag)] %>% dcast(usage.flag ~type)
## Using 'N' as value column. Use 'value.var' to override
## usage.flag 220 221 230 231 233 240 243 245 246 247 251 253 254 280
## 1: -1 403 6 NA 8868 6 461 203 7109 6397 9247 18753 260 981 NA
## 2: 1 1152 34 2 1466 171 NA 22 3992 2405 7637 NA 19 31 7
## 281 284 287 290
## 1: 1607 10 43697 107
## 2: 20328 NA 27164 1750
obs <- obs[type %between% c(240, 260)] %>%
.[, sat_type := case_when(
type == 240 ~ "GOES SW winds",
type == 241 ~ "India",
type == 242 ~ "JMA Visible",
type == 243 ~ "EUMETSAT visible",
type == 244 ~ "AVHRR winds",
type == 245 ~ "GOES IR",
type == 246 ~ "GOES WV cloud top",
type == 247 ~ "GOES WV deep layer",
type == 248 ~ "GOES cloud top (sounder)",
type == 249 ~ "GOES deep layer (sounder)",
type == 250 ~ "JMA WV deep layer",
type == 251 ~ "GOES visible",
type == 252 ~ "JMA IR winds",
type == 253 ~ "EUMETSAT IR winds",
type == 254 ~ "EUMETSAT WV deep layer winds",
type == 257 ~ "MODIS IR",
type == 258 ~ "MODIS WV cloud top",
type == 259 ~ "MODIS WV deep layer winds",
type == 260 ~ "VIIR IR winds")]
obs[type %between% c(240, 260), .N, by = .(var,type, sat_type, date, exp, usage.flag)] %>%
ggplot(aes(date, N)) +
geom_line(aes(color = factor(type))) +
geom_point(aes(color = factor(type))) +
facet_wrap(usage.flag ~ exp, scales = "free") +
labs(title = "Observaciones de viento",
linetype = "Uso",
color = "type") +
theme_minimal()